/**
 * curry函数， 传递的参数是函数
 */

function curry(fn){
    return function curriedFn(...args) {
        if(args.length < fn.length) {
            return function (){
                return curriedFn([...args, ...arguments])
            }
        }
        return fn(...args)
    }
}

function sum(a, b) {
    return a + b
}

console.log(curry(sum, (1, 2, 3, 4, 5)));



// 红宝书上的curry函数
function curryV2(fn){
    const args = Array.prototype.slice.call(arguments)[1]

    return function (){
        const _args = Array.prototype.slice.call(arguments)
        const finArgs = [..._args, args]
        // 这里使用apply是因为改变了this的指向， 其实可以使用_this来代替this的
        return fn.apply(null,finArgs)
    }
}


console.log('curryV2'+curryV2(sum = (a, b) => a + b, 1, 2)());

// 红宝书上的curry函数
function curryV3(fn){
    const _this = this
    const args = Array.prototype.slice.call(arguments)[1]

    return function (){
        const _args = Array.prototype.slice.call(arguments)
        const finArgs = [..._args, args]
        // 这里使用apply是因为改变了this的指向， 其实可以使用_this来代替this的
        return _this.fn(finArgs)
    }
}


// var a={
//     num:1,
//     toString:function(){
//         return a.num++;
//     }
// }
// // 这里借用了，转换的思想， 可以将一个值的toString进行调用
// if(a==1&&a==2&&a==3){
//     console.log("恭喜答对啦！");
// }else{
//     console.log("还是错了小子！");
// }

function curryV4(fn){
    const oldArgs = Array.prototype.slice.call(arguments,1)
    const _this = this;

    return function (){
        const newArgs = Array.prototype.slice.call(arguments)
        const args = [...oldArgs, newArgs]
        _this.fn.apply(args)
    }
}


function curryyy(fn){
    const args = [].slice.call(arguments, 1)
    return function (){
        var newArgs = [...args, ...[...arguments]]
         fn.apply(this, newArgs)
    }
}

function add(a, b){
    console.log(a + b)
}

let addStrength = curryyy(add, 1, 2)
addStrength()








